package com.example.redisdemo.connecion;

import com.example.redisdemo.protocol.Proctool;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Connection {
    // 1、网络编程
    private Socket socket;
    // ip地址
    private String host;
    // 端口号
    private int port;
    private OutputStream outputStream;
    private InputStream inputStream;
    // 客户端调用构造方法设初始值
    public Connection(String host,int port){
        this.host=host;
        this.port=port;
    }
    // 2、连接方法
    private void connect(){
        try {
            socket = new Socket(host,port);
            inputStream = socket.getInputStream();
            //发送6中的b
            outputStream = socket.getOutputStream();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 6：给服务端发送数据：传输的是字节0和1，所以要转化为byte数组，发送完成后会拿到连接，所以返回的是当前连接对象，这个方法类型也为Connection。
    public Connection sendCommand(Proctool.Command get, byte[]... b) {
        // 连接
        connect();
        // 发送，也就是消息处理层的协议，我们不知道此协议，因此不能直接发送b，但是app中的Jedis知道，因此可以做抓包：伪造一个redis服务端，拦截数据并分析。

        // 返回当前类型对象,返回的是Connection类,那么就必须return一个Connection类的实例,因为当前是Connection类，所以this就是Connection类的实例的引用
        return this;
    }

    public String getReply() {
        byte b[] = new byte[1024];
        try {
            socket.getInputStream().read(b);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 将b从字节转化为字符串
        return new String(b);
    }
}

